Bingo, Computer Graphics & Game Developer

Ray Tracing Notes 1

所有的内容都是根据Ray Tracing Course上的课程所做的笔记, 因此会包含单词释义, 概念记录等等

初级单词释义

单词 释义
Radiant flux 辐射通量
Irradiance 辐射度
Radiance 辐射
V\vec V

3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z’/> | 从观察者方向发出的方向 |
| N\vec N | 面法线 |
| L\vec L | 指向光源的向量 |
| R\vec R | 全局光照中反射而来的光线方向 也就是光源在表面上L反射出的间接光照 R=L2N(LN)\vec R = \vec L - 2\vec N(\vec L \vec N), 也就是L.N\vec L \ldotp \vec N得到cosα\cos \alpha 乘以N\vec N 表示L\vec LN\vec N方向上的投影 在根据平行四边形法则即可得到R\vec R |
| θi\theta _i | 入射角 |
| θr\theta _r | 反射角 |


如何描述不同的表面材质?

不同的材质在接受入射光时, 会反射向不同的方向以及吸收不同数量的光


BRDF概念定义

frf_r(入射光方向, 光在表面上的点, 出射光方向)

fr(ω,x,ω)f_r(\omega, x, \omega')

因此称他们的集合为BSDF或者为BxDF 也就是说一个表面既能反射也能折射的现象


BRDF的性质

双向性: 也就是fr(\omega’, x, \omega) = fr(\omega, x, \omega’) 当出射光变为入射光再次计算 结果得到原来的入射光方向

正性: BRDF的fr(\omega’, x, \omega) ≥0

能量守恒: 表面可能会吸收或者反射入射光 但是两者的能量和都不能超过入射光能量

在所有可能的出射(折射 反射的面上积分) 同时也算上了光的衰减现象

Ωfr(ω,x,ω)cosθdω\int_{\Omega}f_r(\omega, x, \omega') cos\theta d\omega (实际为入射光和出射光能量的比值) \le1 如果=1那么就是发生了全反射现象 \le1也就是说一部分的光被吸收了 不可能出现能量不守恒的情况


渲染公式定义解读

Rendering Equation

Lo(x,ω)=Le(x,ω)+ΩLi(x,ω)fr(ω,x,ω)cosθdω
L_o(x, \vec \omega) = L_e(x, \vec \omega) + \int_{\Omega}L_i(x, \vec \omega') f_r(\vec \omega, x, \vec \omega' ) cos\theta d\vec \omega

单词 释义
LoL_o 从表面点x上离开的辐射度
LeL_e 从表面点x上发射出的辐射度
Ω...dω\int_{\Omega}…d\vec\omega

3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z’/> | 所有外来的入射光引起的出射光的总和 |
| Li(x,ωL_i(x, \vec\omega') | 从给定方向上指向点x的入射辐射度 |
| fr(ω,x,ω)f_r(\vec\omega,x,\vec\omega') | BRDF |
| cosθcos\theta | 光衰减系数 |


Ambient模型

最简单的BRDF模型 ambient模型 尽管不是基于物理 但会是一个很好理解的上手模型公式 也就是一个模型将会有不受位置角度影响的基本RGB颜色

I=kaIa
I = k_aI_a

单词 释义
I 光强度
kak_a 环境光系数
IaI_a 环境光光照强度


漫反射Diffuse模型

I=ka,λ(L.N)
I = k_{a,\lambda}(\vec L \ldotp \vec N)

单词 释义
kak_a 漫反射系数
L\vec L

3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z’/> | 指向光源的向量 |
| N\vec N | 面法线 |


镜面反射模型Specular

I=ks(V.R)n
I = k_s(\vec V \ldotp \vec R)^n

单词 释义
ksk_s 镜面系数
V\vec V

3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z’/> | 指向观察者/摄像机的方向 |
| R\vec R | 反射光线的方向 |
| (.)n(.)^n | 反光度 |


Phong反射模型就是讲上述三者模型集中在一起的一个最简化的模型

这也就是为什么无论你怎么样变换摄像机的位置, 也就是V\vec V的方向, 但是漫反射颜色都不会因此发生改变的原因。而镜面反射同理, 是因为一部分高光从表面上反射而来, 也就是R\vec R与我们的观察方向V\vec V之间的夹角非常的接近, 这也就使得最终的II显示在最终的效果上显得非常明亮的原因。

最终的受过大量简化后的Rendering Equation如下

I=kaIa+Ii(kd(L.N)+ks(V.R)n)
I = k_aI_a + I_i(k_d(\vec L \ldotp \vec N) + k_s(\vec V \ldotp \vec R)^n)

这只发生在直接光照上, 而间接光照没有考虑在其中, 在光线照射不到的地方, 环境光帮助我们找回了看不见的区域。

注意 这是一个基于物理的渲染的近似 只用于方便理解而做


Fresnel equation(Schlick’s approximation)

R(θ)=Ro+(1Ro)(1cosθ)5
\vec R(\theta) = \vec R_o + (1-\vec R_o)(1-cos\theta)^5

单词 释义
R(θ)\vec R(\theta)

3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z’/>(θ) | 入射角为θ\theta时发生反射的可能性 |
| Ro\vec R_o | 当入射角为0的时候, 也就是发现方向, 发生反射的概率,也可以是Ro=(n1n2n1+n2)2\vec R_o = (\frac{n_1-n_2}{n_1+n_2})^2, n1n_1为媒介的传输系数 n2n_2在真空或者空气下为1 |

n介质=speed of light in vacuumspeed of light in medium
n_{\text{介质}} = \frac{\text{speed of light in vacuum}}{\text{speed of light in medium}}

因此在反射现象不明显折射现象较为明显的玻璃这些材质时, 最终计算出来的RoR_o将会非常的接近0

原始的Fresnel equation

Rs(θ)=n1cosθn21(n1n2sinθ)2n1cosθ+n21(n1n2sinθ)22
R_s(\theta) = |\frac{n_1cos\theta - n_2\sqrt{1-(\frac{n_1}{n_2}sin\theta)^2}}{n_1cos\theta + n_2\sqrt{1-{(\frac{n_1}{n_2}sin\theta)^2}}}|^2

因此当传输的介质为真空时, Schlick的近似公式计算出来的只是非常贴近0的(1cosθ)5(1-cos\theta)^5, 而原始公式计算出的可能性直接就是0


Snell’s law

sinθ1sinθ2=v1v2=n2n1\frac{sin\theta_1}{sin\theta_2} = \frac{v_1}{v_2} = \frac{n_2}{n_1}

全反射现象

sinθ2=(n2n1sinθ2)θ2=90sin\theta_2 =( \frac{n_2}{n_1}sin\theta_2)|_{\theta_2=90}
计算出的结果有一定的可能出现大于1的情况

也就是光从介质系数大的物体中折射到小系数中, 折射光线与法线夹角成90度, 此时折射现象就不再发生。

折射光线那么这时就发生了全反射现象此时θcritical=arcsin(n2n1)\theta_{critical} = arcsin(\frac{n_2}{n_1})


Ray Sphere Intersection

Ray的参数表示形式 r(t)=o+td\vec r(t) = \vec o + t\vec d, 一般的平面圆的隐式方程表示为f(x,y)=0f(x, y) = 0, 例如球的一般方程为(xa)2+(yb)2r2=0(x-a)^2+(y-b)^2-r^2=0, 而其参数方程就可以写成x=x(t),y=y(t),r=(t)x=x(t), y=y(t),r=(t)

球的方程

(pc).(pc)=r2
(\vec p - \vec c) \ldotp (\vec p - \vec c) = \vec r^2

Ray的方程

r(t)=o+td
\vec r(t) = \vec o + t\vec d

简单的直线方程代入球面坐标求解(Δ)b24ac(\Delta)b^2-4ac即可

t2(b.b)+2(oc)td+(oc).(oc)r2=0
t^2(\vec b \ldotp \vec b)+2(\vec o - \vec c)t\vec d + (\vec o - \vec c) \ldotp (\vec o - \vec c) - r^2 = 0

t1=B+B24AC2A
t_1=\frac{-B+\sqrt{B^2-4AC}}{2A}

t1=BB24AC2A
t_1=\frac{-B-\sqrt{B^2-4AC}}{2A}


Surface Normals

如若给定一个表面的隐式方程f(x,y)=0f(x, y)=0, 那么他的面法线就是该函数在(x,y)(x, y)处的梯度f(x,y)\nabla f(x,y), 梯度定义为f(x,y,z)=(fx,fy,fz)\nabla f(x, y, z) = (\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}, \frac{\partial f}{\partial z})


例如求椭球形面的面法线

f(x,y,z)=x2a2+y2b2z
f(x, y, z) = \frac{x^2}{a^2}+\frac{y^2}{b^2}-z

其中a和b为椭球形的曲率

f(x,y,z)=(2xa2,2yb2,1)
\nabla f(x, y, z) = (\frac{2x}{a^2}, \frac{2y}{b^2}, -1)

在求得光线与最近物体交点的时候, 我们会排除t0t\le 0的情况, 因为=0=0时属于自相交情况


Shadow Computation

一个光源下的阴影计算方式

II(Ilight相对于该点光源的可见面积整个光源的面积)
I\gets I(I_{light}\frac{\text{相对于该点光源的可见面积}}{\text{整个光源的面积}})

因此我们可以通过发射shadow ray来近似上述计算结果

I(Ilight未被阻挡的阴影射线数量发射的阴影射线总数)
I(I_{light}\frac{\text{未被阻挡的阴影射线数量}}{\text{发射的阴影射线总数}})

在本质上这就是Monte Carlo Integration


Illuminaton Equation with recursion

I=kaIa+Ii(kd(L.N)+ks(V.R)n)+ktIt+krIr
I = k_aI_a +I_i(k_d(\vec L \ldotp \vec N) + k_s(\vec V \ldotp \vec R)^n) + k_tI_t + k_rI_r


新增的ktIt+krIrk_tI_t+k_rI_r为递归项

单词 释义
ktk_t 菲涅尔透射系数(发生折射的概率)
ItI_t 透射方向来的光强度
krk_r 菲涅尔反射系数(发生反射的概率)
ItI_t 反射方向来的光强度
[D][D]^* 任何反射而来的漫反射光照
[SD][S D]

Ray Tracing vs Global illumination

I=kaIa+Ii(kd(L.N)+ks(V.R)n)+ktIt+krIr
I = k_aI_a +I_i(k_d(\vec L \ldotp \vec N) + k_s(\vec V \ldotp \vec R)^n) + k_tI_t + k_rI_r

vs
vs

Lo(x,ω)=Le(x,ω)+ΩLi(x,ω)fr(ω,x,ω)cosθdω
L_o(x, \vec \omega) = L_e(x, \vec \omega) + \int_\Omega L_i(x, \vec \omega)f_r(\vec \omega, x, \vec \omega')cos\theta d\vec \omega'

可以看到的就是illumination Equation中使用的I本质上是物理空间中不存在的光照强度, 而不是Global illumination中的辐射度计算。


Ray Tracing 中无法做到以下几点

  1. 间接光照/颜色渗透现象(LDD[D]ELDD[D^*]E), 从其他表面反射而来得Diffuse Color不能被直接计算
  2. 焦散现象(LE[S]DELE[S^*]DE), 从其他表面反射来 Specular Color不能被直接计算
  3. 全局光照中阴影无需手工计算, 因为阴影的形成本质上就是光照未被照到自然形成的。

因为在ray tracing当中我们只计算了局部的incoming漫反射光照, 但事实上我们应该采集在整个上半球上的所有入射光, 也就是渲染方程中积分的意义


真实的基于物理的漫反射BRDF模型为, ρ\rho代表反射率, ρ(0,1)\rho \in (0, 1), 并且下列BRDF也是概率分布函数, 只需要检验0πρ1dω=1\int_{0}^{\pi}\frac{\rho}{1}d\omega = 1.

Diffuse BRDF

fr(ω,x,ω)=ρπ
f_r(\vec \omega, x, \vec \omega') = \frac{\rho}{\pi}

在这个模型中, 它将会收集整个半球上的入射光, 那么如果手动射入一根光线, 那么出射光出射在半球上的任意方向上得概率都是一致的。其中, 该BRDF函数也是一个概率分布函数。

π1πdω=1
\int_{\pi}\frac{1}{\pi}d\vec \omega = 1

镜面反射模型也就意味着如若给定一个入射光方向, 那么出射光的方向只有一个。

Specular BRDF

fr(ω,x,ω)={1,反射方向0,非反射方向的任意方向
f_r(\vec \omega, x, \vec \omega') = \begin{cases}
1, &\text{反射方向} \\
0, &\text{非反射方向的任意方向}
\end{cases}

简单来讲就是一个二项分布


Monte Carlo Intergration

Hit or Miss法

  1. 在一张纸上给定的区域内绘制当前的函数

  2. 向整个区域打点

  3. 记录每个点的Hit/Miss情况

  4. abf(x)dx/Ahitsmisses+hits\int_a^bf(x)dx/A \approx \frac{hits}{misses+hits}最终结果就可以这样近似

同理也就可以估计π\pi的值


Path Tracing

如果场景中只有一个面积非常小的点光源, 那么即便是spp足够大, 最终的结果也很有可能是一团黑

原因在于, 只有当发射的ray相交到了一个光源时, 他才会返回一个足够的光亮度, 因此每次在BRDF的概率密度范围内随机反射光线, 只有很小的概率击中光源并返回一个值。


解决方案, 极大的缩短追踪Depth是最终的目标。因此在每次递归到Surface上一点时, 不仅仅只是计算上从随机方向上反射而来得光照, 还需直接计算点到光源之间的通路(间接等价于, 随机发射一条光线到光源方向并返回一个可能的值)。

这就大大的缩短了Path Tracing中需要Sample的光线的数量。同样数量的光线的情况下, 整个场景会显得格外的明亮。

需要注意的是, 如若在Path Tracing中随机hit到了光源, 我们并不直接返回光源的亮度, 因为我们在Path Tracing的过程中已经计算过他的亮度。这也就很好的解耦了直接光照和间接光照。


Low Discrepancy Series

优点:

当构建一个渲染时, 你不会得到真正的随机采样结果, 因此在渲染一个动画的时候, 你能够得到连贯一致的噪点分布。

缺点:

没有……


Russian Roulette Path Termination

问题出在, 渲染方程本质上是一个无穷积分, 因此理论上来说Path Tracing的Depth应该是无穷大, 但事实上不能。因此什么时候结束tracing就成为了一个比较大的问题。

因此我们的目标就是, 使用概率论来解决这个问题, 当完成了第i次迭代之后, 是否停止继续追踪取决于概率, 在一定的概率内随机决定是否要终止当前这条光线。


假定目前有一随机变量ξ(0,1)\xi \in (0, 1)

ξ<pi\xi<p_i, 那么继续追踪当前的光线, 最终计算得到的辐射度就为Lipi\frac{L_i}{p_i}

ξpi\xi \ge p_i, 那么结束当前的光线追踪迭代, 最终计算得到的辐射度为0

可以通过计算期望E[Li^]=piLipi+(1pi).0=LiE\lbrack \hat{L_i} \rbrack = p_i * \frac{L_i}{p_i} + (1-p_i) \ldotp 0 = L_i , 来印证计算结果的正确性。


pip_i的取值范围, pi=0p_i = 0这样的情况不会发生, 因为光线一次也不于物体相交(Lipi\frac{L_i}{p_i}非法); pi=1p_i = 1这样 情况也不会发生, 因为光线追踪永不停止。尽管pip_i的取值理论上在这(0,1)(0, 1)区间内都是可以接受的, 但事实上我们最好选取一个能够让结果更快收敛的概率值。


所以pip_i的取值也就非常的关键, 我们总是希望更远的采样那些明亮的路径而不是较为黑不溜秋的路径, 因此我们就可以设pip_i为简单的反射率, 这可以极大的降低方差。


Consistent

limNEN[F]=f(x)dx
\lim_{N \to \infty}E_N[F] = \int f(x)dx

一致性算法表示算法本身在经过无穷的随机采样逼近之后, 将会收敛, 但这将会花上非常多的时间。


Unbiased

EN[Ff(x)dx]=0
E_N[F - \int f(x)dx] = 0

  1. 无论采样多少次数, 估计量与期望之间的误差都为0
  2. 合并两张由无偏算法生成的图片将会带来更好的效果
  3. 高估/低估被积函数的概率都是相同的


现代Path Tracing优化算法

Bidirectional Path Tracing

遇到了光源在Next Event Estimation也难以处理的情况, 比如光源和摄像机之间存在一层遮罩, 因此只有摄像机发出的光光线随机的走到了光源中才能够返回一个较为明亮的颜色。

关键思想: 从摄像机和光源处同时发射光线, 并且在一定的depth结束彼此的追踪之后, 连接两条路径的结尾点即可。

总结:更快的焦散和计算收敛速度, 尤其是在室内场景中, 但添加上Multiple Importance Sampling和路径的权重似乎会增加计算时间。


Metropolis Light Transport

关键思想: 对于明亮的区域我们会采样更多的次数, 相比于暗处的区域的话。本质上讲就是明亮处采样的概率会更高。


cornell_box_in_cycles_ii_by_elbrujodelatribu-d5gu2uh

配图为康奈尔盒